package main

import "fmt"

func main() {
	s := "abcabcbb"
	fmt.Println(longestSubstringWithoutRepeatingCharacters(s))
}

func longestSubstringWithoutRepeatingCharacters(s string) int {
	if len(s) == 0 {
		return 0
	}
	var max int
	var start int
	var end int
	var mapChar = make(map[byte]int, 26)
	for end < len(s) {
		// 当前字符是否存在
		if _, ok := mapChar[s[end]]; ok {
			// 存在，则判断上次出现的位置是否在start位置的右边
			if mapChar[s[end]] >= start {
				// 更新max
				if end-start > max {
					max = end - start
				}
				// 在右边，则更新start为上次出现的位置+1
				start = mapChar[s[end]] + 1
			}
		}
		// 不存在，则更新mapChar
		mapChar[s[end]] = end
		end++
	}
	//遍历完了，则更新max
	if end > start {
		if end-start > max {
			max = end - start
		}
	}
	return max
}
